package com.tjcd.project.library_base.common.utils;

import android.app.Activity;
import android.view.View;

import com.tjcd.project.library_base.common.utils.callback.MultipleViewOnClickListener;

import java.util.concurrent.TimeUnit;

import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.disposables.Disposable;
import io.reactivex.rxjava3.subjects.PublishSubject;

/**
 * @Author jiangKunKun
 * @CreateDate 2024/10/30
 * @Description 多个view点击事件监听
 * @SpittingGrooves
 */
public class MultipleViewClick {
    /**
     * 用于发布点击事件的 PublishSubject，现在发布的是视图的 ID。
     */
    private PublishSubject<Integer> subject;

    /**
     * 延迟时间，默认为 0 毫秒。
     */
    private int delayMillis = 0;
    /**
     * 监听必须要设置
     */
    private MultipleViewOnClickListener mListener;

    /**
     * 私有构造函数，防止外部直接实例化。
     */
    private MultipleViewClick() {
        this.subject = PublishSubject.create();
    }

    /**
     * 创建一个新的 MultipleViewClick 实例
     * 必须要设置 setOnLastClickListener
     * @return 新创建的 MultipleViewClick 实例。
     */
    public static MultipleViewClick build() {
        MultipleViewClick instance = new MultipleViewClick();
        return instance;
    }

    /**
     * 设置最后一次点击的回调监听器，并订阅 subject 的 debounce 流。
     * @param listener 最后一次点击的回调监听器。
     * @return 当前 MultipleViewClick 实例，支持链式调用。
     */
    public MultipleViewClick setOnLastClickListener(MultipleViewOnClickListener listener) {
        mListener = listener;
        return this;
    }

    /**
     * 创建
     * @return
     */
    public Disposable create() {
        if (mListener == null) {
            throw new IllegalStateException("必须先调用 setOnLastClickListener 方法设置点击监听器");
        }
        return subject.debounce(delayMillis, TimeUnit.MILLISECONDS)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(mListener::onClick);
    }

    /**
     * 添加需要监听的视图数组。
     * @param views 需要监听的视图数组。
     * @return 当前 MultipleViewClick 实例，支持链式调用。
     */
    public MultipleViewClick addViewListener(View... views) {
        for (View view : views) {
            view.setOnClickListener(v -> subject.onNext(v.getId()));
        }
        return this;
    }

    /**
     * 添加需要监听的视图 ID 数组。
     * @param activity 上下文，用于查找视图。
     * @param viewIds 需要监听的视图 ID 数组。
     * @return 当前 MultipleViewClick 实例，支持链式调用。
     */
    public MultipleViewClick addViewListener(Activity activity, int... viewIds) {
        for (int viewId : viewIds) {
            View view = activity.findViewById(viewId);
            if (view != null) {
                view.setOnClickListener(v -> subject.onNext(v.getId()));
            }
        }
        return this;
    }
    /**
     * 添加需要监听的视图 ID 数组，适用于自定义视图或布局。
     * @param rootView 根视图，用于查找子视图。(dialog, fragment)
     * @param viewIds 需要监听的视图 ID 数组。
     * @return 当前 MultipleViewClick 实例，支持链式调用。
     */
    public MultipleViewClick addViewListener(View rootView, int... viewIds) {
        for (int viewId : viewIds) {
            View view = rootView.findViewById(viewId);
            if (view != null) {
                view.setOnClickListener(v -> subject.onNext(v.getId()));
            }
        }
        return this;
    }

    /**
     * 设置延迟时间。
     * @param delayMillis 延迟时间，单位为毫秒。
     * @return 当前 MultipleViewClick 实例，支持链式调用。
     */
    public MultipleViewClick setDelay(int delayMillis) {
        this.delayMillis = delayMillis;
        return this;
    }
}
